//
// Created by Crestimes on 2024/11/15.
//

#ifndef PARSER_H
#define PARSER_H

#include <vector>
#include <fstream>
#include <map>
#include <stack>
#include <sstream> // [GUI CHANGES]

#include "GNode.h"
#include "Production.h"
using namespace std;


class Parser {
public:
    Parser(const vector<Production>& productions, const vector<map<string, string>>& lrTable,
           const set<string>& allEndCharNames, const vector<GNode>& tokens, stringstream& out);

    GNode parse(); // [GUI CHANGES] 分析成功后返回语法树根节点，用于展示
    stringstream &out; // [GUI CHANGES] 保存日志输出内容，展示到gui界面

private:
    GNode buildGNode(const Production& production, stack<int>& stateStack, stack<GNode>& nodeStack);
    void printGTree(const GNode& node, int depth); // [GUI CHANGES] 去掉静态方法

    vector<Production> productions; // 所有的文法语句（0号文法是S'->S）
    vector<map<string, string>> lrTable; // lr分析表
    set<string> allEndCharNames; // 所有文法中的终结符符号的名字集合
    vector<GNode> tokens; // 代码分词结果，每个分词结果初始化为一个语法树节点
};


#endif //PARSER_H
